home *** CD-ROM | disk | FTP | other *** search
-
- /*
- FileMon V1.0 (C) 1989 C.Peppermüller
- P u b l i c D o m a i n
- Achtung! Bei vielen Änderungen dieses Quelltextes
- können unerwünschte Seiteneffekte auftreten!
-
- geschrieben mit Turbo-C V1.0
- */
-
- /* Libraries ... */
-
- #include <stdio.h>
- #include <ext.h>
- #include <tos.h>
- #include <stdlib.h>
- #include <string.h>
-
- #define putstr(a) fputs(a,stdout)
- /* Stringausgabe ohne Zeilenvorschub */
-
- /* Für schnelle Änderungen hier alle wichtigen Texte, bis auf die
- Prozessorbefehle, die so bleiben sollten, wie sie sind. */
-
- #define txt1 "Ein Parameter langt."
- #define txt2 "Auf Wiedersehen!\x1B""f\x1Bw"
- #define txt3 "Tschüß!\n\x1B""f\x1Bw"
- #define txt4 "\x1B""E\x1B""e\x1Bv\n" \
- "************************************************\n" \
- "* *\n" \
- "* FILEMON V1.0 - der ultimative File-Manager *\n" \
- "* zum Patchen + Textsuchen *\n" \
- "* (C) 1989 Christian Peppermüller *\n" \
- "* P u b l i c D o m a i n *\n" \
- "* *\n" \
- "************************************************"
- #define txt5 "?DEFGHLOQSTWX"
- #define txt6 "\nBitte den Filenamem: "
- #define txt7 "Von Kommandozeile: "
- #define txt8 "Nanu - File nicht gefunden !"
- #define txt9 "Oh - Kein Speicher."
- #define txt10 "Nanu - kann File nicht lesen !"
- #define txt11 "Filelänge: $%6lX\n"
- #define txt12 "\x1b""E\n" \
- "***************************************\n" \
- "* Hilfe - FileMon *\n" \
- "***************************************\n\n" \
- "? Diese Hilfe.\n" \
- "X,T Wechselt zu Modus HEX (X) oder TEXT (T).\n" \
- "D{a {b}} Dump von a bis b; Text mit of/ox.\n" \
- "Wfilename Sichert das (veränderte) File.\n" \
- "Oof Setzt Offset für Text bei D und C.\n" \
- "Eox Setzt EOR-Byte für Text bei D und C.\n" \
- "Sa {b} Ändert Text/Bytes von a bis b; im\n" \
- " Modus T: of/ox. Extra-Byte absolut.\n" \
- "F{a b {o1 o2}} Sucht Text/Bytes von a bis b mit Offset\n"\
- " + text/bytes o1 bis o2. Text mit ox !\n" \
- "G... wie F, aber mit EOR-Byte von o1 bis o2.\n"\
- "Ha b liefert a+b a-b (Hex-Arithmetik).\n" \
- "L{a {b}} Disassembliert von a bis b.\n" \
- " a,b: HEX-Langworte bzgl Filebeginn.\n" \
- " of,ox,o1,o2: HEX-Bytes. {}:Optional.\n" \
- " filename,text: ASCII-Text. bytes: bis zu 78 HEX-Bytes.\n"\
- " Kommandozeile: Kommandos, Modus (X/T), of , ox .\n"
- #define txt13 "Offset geändert."
- #define txt14 "Eor-Byte geändert."
- #define txt15 "Nanu - Kann File nicht zum Schreiben öffnen !"
- #define txt16 "Achtung - File gekürzt (Disk voll?) !"
- #define txt17 "Nanu - Kann File nicht schließen !"
- #define txt18 "%s in $%lX Bytes abgespeichert.\n"
- #define txt19 "mehrzeilige Texteingabe. Ende durch Leerzeile."
- #define txt20 "Nun noch das absolute HEX-Endbyte (<RETURN> keins):"
- #define txt21 "Eingabe: Byte1 <RETURN>,.., Ende: Leerzeile."
- #define txt22 "Suche Text: "
- #define txt23 "Suche: Byte <RETURN>,..; Suche starten mit Leerzeile."
- #define txt24 "\nBytes/Text gefunden "
- #define txt25 "\nAbbruch "
- #define txt26 "bei $%6lX mit Offset $%2X .\n"
- #define txt27 "bei %6lX mit EOR-Byte $%2X .\n"
- #define unbekannt "unknown"
-
- /* alles ... */
-
- /* Funktions-Prototypen ( ANSI-C... ) */
-
- int filopen (long a,int b,char *c);
- char menu (void);
- void init_all (void);
- void dump (void);
- void save (void);
- void change (void);
- void search (char a);
- void help (void);
- void offset (void);
- void xorset (void);
- void hex (void);
- void founds (long a,int b,int c,char d);
- int ausw (char *a,int b,long *c,long d);
- void disassemble (void);
- void disass (void);
- unsigned int getword (void);
- char *branch (unsigned int a,int b);
- char *getlen (int a);
- void addr (char *a,unsigned int b,unsigned int c);
- void movemreg (char *a,int b);
- unsigned int qnum (unsigned int a);
-
- /* Ein paar Variablen */
-
- unsigned char *filstart,*physfilbuf,*curbyte,*cmdlin,*cmdlist;
- char bufstr[70],dat1[30],dat2[30],opt;
- long flen,physflen,an,en,PCcount,h1,h2;
- unsigned int cmdw,art,adr1,reg1,adr2,reg2;
- int ofs,xorb,cmdlen;
-
- /* Hier das Hauptprogramm */
-
- int main(int argc,char *argv[])
- {
- char c;
- init_all();
- if (argc>2) puts(txt1);
- do {
- h1=filopen(h1,argc,argv[1]);
- } while ((h1>0) && (h1<4));
- if (h1)
- { puts(txt2);
- return (-1); }
- do{
- rewind (stdin); c=menu();
- switch(c)
- { case'D': dump(); break;
- case'W': save(); break;
- case'S': change(); break;
- case'L': disassemble(); break;
- case'G':
- case'F': search(c); break;
- case'X':
- case'T': opt=c; break;
- case'?': help(); break;
- case'H': hex(); break;
- case'O': offset(); break;
- case'E': xorset(); }
- } while (c!='Q');
- puts(txt3);
- free(physfilbuf);
- return(0);
- }
- void init_all()
- {
- puts(txt4);
- opt='X'; h1=an=en=ofs=xorb=0; rewind(stdin);
- cmdlist=txt5;
- return;
- }
-
- /** filopen() liest zu bearbeitendes File ganz ein. **/
-
- int filopen(long mode,int compar,char argum[])
- {
- int handle;
- long tst;
- if (mode || (compar<2))
- { putstr (txt6); gets (bufstr); }
- else
- { strcpy (bufstr,argum);
- putstr (txt7); puts (bufstr); }
- if ((handle=Fopen (bufstr,0))<0)
- { puts (txt8); return(++mode); }
- physflen=Fseek (0L,handle,2);
- Fseek (0L,handle,0);
- physfilbuf=malloc (physflen+70L);
- if (physfilbuf==NULL)
- { Fclose(handle); puts(txt9); return (-1); }
- tst=Fread (handle,physflen,physfilbuf);
- Fclose (handle);
- if ((physflen<=0) || (tst<physflen))
- { puts (txt10);
- free (physfilbuf); return (++mode); }
- printf (txt11,physflen);
- filstart=physfilbuf; flen=physflen;
- if ((*filstart==0x60) && (*(filstart+1L)==0x1A))
- { flen-=0x1C; filstart+=0x1CL; }
- return(0);
- }
-
- char menu()
- {
- char cc;
- do {
- printf ("%s *%c*%02X*%02X* >",cmdlist,opt,ofs,xorb);
- rewind(stdin); gets(bufstr);
- cc=bufstr[0]; if (cc>'Z') cc-=32;
- } while (strchr(cmdlist,cc)==NULL);
- cmdlin=&(bufstr[1]);
- return (cc);
- }
-
- void help()
- { puts(txt12);
- return;
- }
- void offset()
- {
- if (cmdlin[0]==0) return;
- sscanf (cmdlin,"%x",&ofs);
- puts(txt13);
- return;
- }
- void xorset()
- {
- if (cmdlin[0]==0) return;
- sscanf (cmdlin,"%x",&xorb);
- puts(txt14);
- return;
- }
- void dump()
- {
- long i,j,stp;
- int byt,brk;
- unsigned char *fzchn,dmp[17],c;
- dmp[0]=' '; dmp[17]=brk=0; en=0L;
- if (cmdlin[0])
- { sscanf(cmdlin,"%lX %lX",&an,&en); if (an<0) an=0; }
- if (en==0L) en=an+((opt=='T')? 0x3FFL: 0xFFL);
- if (en>flen) en=flen;
- stp=(opt=='T')? 64: 16;
- i=an;
- if (an>flen) an=flen;
- while (i<=en)
- { fzchn=&(filstart[i]);
- printf ("%6lX : ",i);
- for (j=i;j++<i+stp;)
- { byt=*(fzchn++);
- if (j>flen) byt=0;
- c=(((byt+ofs)&0xFF)^xorb);
- if (c<' ') c='.';
- switch (opt)
- { case'T': putchar(c); break;
- case'X': dmp[j-i]=c; printf (" %02X",byt); }
- if (kbhit())
- if ((getch()&0xFF)==27) brk=1; }
- an=i;
- if (brk) { putchar('\n'); return; }
- if (opt=='T') putchar('\n');
- else { putstr(" "); puts(dmp); }
- i+=stp; }
- an=i;
- return;
- }
- void save()
- {
- int handle;
- long tst;
- if (cmdlin[0]>31) handle=Fcreate(cmdlin,0);
- else handle=-1;
- if (handle<0)
- { puts(txt15);
- return; }
- tst=Fwrite (handle,physflen,physfilbuf);
- if (tst<flen)
- puts(txt16);
- if (Fclose(handle)<0)
- puts(txt17);
- else printf(txt18,cmdlin,tst);
- return;
- }
- void change()
- {
- long an,en,i;
- int fl;
- char text[200]; an=0L; en=flen;
- sscanf(cmdlin,"%lX %lX",&an,&en);
- switch(opt)
- { case'T': puts(txt19);
- i=an;
- do { rewind(stdin);
- printf("%6lX: > ",i);
- gets (text);
- } while (ausw(text,ofs,&i,en));
- puts(txt20);
- gets(bufstr); fl=0x300;
- sscanf(bufstr,"%x",&fl);
- if (fl<0x100)
- *(filstart+i)=fl;
- return;
- case'X': puts(txt21);
- i=an;
- while (i<=en)
- { rewind(stdin);
- printf("%6lX: %02X > ",i,*(filstart+i));
- gets (text);
- if (text[0]==0) break;
- sscanf(text,"%x",&fl);
- *(filstart+(i++))=fl; } }
- return;
- }
- int ausw(char str[],int ofs,long *i,long en)
- {
- int j;
- unsigned char *zchn,z;
- if (str[0]==0) return (0);
- zchn=filstart+(*i);j=0;
- while (((*i)++<en-1) && ((z=str[j++])!=0))
- *(zchn++)=(((z-ofs)&0xFF)^xorb);
- (*i)--;
- return(1);
- }
- void hex()
- { long a,b;
- if (cmdlin[0]==0) return;
- sscanf(cmdlin,"%lX %lX",&a,&b);
- printf("%lX %lX\n",a+b,a-b);
- return;
- }
- void search(char w)
- {
- long an,en,i;
- int ofs1,ofs2,curofs,lng,k,f,xorbs;
- char *fzchn,*fzn,c,name[80],srch[80];
- ofs1=ofs2=((opt=='X')? 0: ofs); an=0; en=flen;
- xorbs=((opt=='T')? xorb: 0);
- sscanf(cmdlin,"%lX %lX %x %x",&an,&en,&ofs1,&ofs2);
- lng=0;
- switch(opt)
- { case'T': putstr(txt22);
- gets(name);
- lng=strlen(name);
- break;
- case'X': puts(txt23);
- do { gets(bufstr);
- if (bufstr[0]==0) break;
- sscanf (bufstr,"%x",&f);
- name[lng++]=(f&0xFF);
- } while (lng<79);
- name[lng]=0; }
- if (an<0) an=0;
- if (en>flen) en=flen;
- if (ofs1<0) ofs1=0;
- if (ofs1>255) ofs1=255;
- if (ofs2>255) ofs2=255;
- if (ofs2<0) ofs2=0;
- curofs=ofs1;
- while (curofs<=ofs2)
- { for (k=0;k<=lng;)
- { if (w=='F') srch[k++]=(((name[k]-curofs)&0xFF)^xorbs);
- else srch[k++]=(((name[k]-ofs)&0xFF)^curofs); }
- c=srch[0];
- putchar('*');
- i=an-1L;
- fzchn=filstart+i;
- while (i++<en)
- { if (*(++fzchn)==c)
- { k=0; f=1; fzn=fzchn;
- while ((++k<lng) && (f!=0))
- { if (*(++fzn)!=srch[k]) f=0;
- }
- if (f) founds(i,curofs,1,w);
- if (kbhit())
- if (getch()==27)
- { founds(i,curofs,0,w);
- i=en+1; curofs=ofs2+1; } } }
- if (kbhit())
- if ((getch()==27))
- { if (curofs<=ofs2) founds(i,curofs,0,w);
- i=en; curofs=ofs2+1; }
- curofs++; }
- puts("\n");
- return;
- }
- void founds(long j,int cofs,int flg,char w)
- {
- if (flg==1) putstr(txt24);
- else putstr(txt25);
- if (w=='F') printf(txt26,j,cofs);
- else printf(txt27,j,cofs);
- return;
- }
- void disassemble(void)
- {
- en=0L;
- if (cmdlin[0]) sscanf(cmdlin,"%lX %lX",&an,&en);
- if (en==0L) en=an+32L;
- if (an<0L) an=0L;
- if (en>flen) en=flen;
- PCcount=an; curbyte=filstart+an;
- while (PCcount<en)
- { printf("%06lX: ",PCcount);
- disass();
- putchar('\n');
- an=PCcount;
- if (kbhit())
- if (getch()==27) en=PCcount; }
- return;
- }
- void disass()
- {
- char *dummy,*nokn;
- cmdw=getword();
- nokn=unbekannt;
- dummy=bufstr;
- art=(cmdw&0xF000)>>12;
- reg2=(cmdw&0x0E00)>>9;
- adr2=(cmdw&0x01C0)>>6;
- adr1=(cmdw&0x0038)>>3;
- reg1=cmdw&0x0007;
- cmdlen=0; dat1[0]=0; dat2[0]=0;
- dummy[0]=0;
- switch(art)
- { case 0xF: dummy="line_f";
- sprintf(dat1,"$%03X",cmdw&0xFFF); break;
- case 0xA: dummy="line_a";
- sprintf(dat1,"$%03X",cmdw&0xFFF); break;
- case 0x6: dummy[0]='b';
- strcpy(&dummy[1],branch(cmdw,3));
- if ((h2=(cmdw&0xFF))==0)
- { strcat(dummy,".w");
- h2=getword();
- h1=PCcount-2+((h2>0x7FFF)? -(0x10000-h2): h2); }
- else
- { strcat(dummy,".s");
- h1=PCcount+((h2>0x7F)? -(0x100-h2): h2); }
- sprintf(dat1,"$%06lX (rel)",h1); break;
- case 0x1:
- dummy="move.b"; cmdlen=1;
- addr(dat1,adr1,reg1);
- addr(dat2,adr2,reg2);
- break;
- case 0x2:
- dummy="move.l"; cmdlen=4;
- addr(dat1,adr1,reg1);
- addr(dat2,adr2,reg2);
- break;
- case 0x3:
- dummy="move.w"; cmdlen=2;
- addr(dat1,adr1,reg1);
- addr(dat2,adr2,reg2);
- break;
- case 0x0:
- if ((cmdw&0x0100)==0)
- { if ((reg2!=4) && (reg2!=7))
- { switch (reg2)
- { case 0x0: strcpy(dummy,"ori"); break;
- case 0x1: strcpy(dummy,"andi");break;
- case 0x2: strcpy(dummy,"subi");break;
- case 0x3: strcpy(dummy,"addi");break;
- case 0x5: strcpy(dummy,"eori");break;
- case 0x6: strcpy(dummy,"cmpi"); }
- strcat(dummy,getlen(adr2&0x3));
- addr(dat1,0x7,0x4);
- if ((adr1==0x7) && (reg1==0x4))
- { if (cmdlen==1) strcpy(dat2,"ccr");
- else strcpy(dat2,"sr");
- } else addr(dat2,adr1,reg1); break; }
- if (reg2==7) break; }
- if ((adr1==0x1) && (cmdw&0x100)) /* Movep */
- { strcpy(dummy,"movep.w"); cmdlen=2;
- if (cmdw&0x0040)
- { cmdlen=4; dummy[6]='l'; }
- if (cmdw&0x0080)
- { addr(dat1,0,reg2);addr(dat2,5,reg1); }
- else
- { addr(dat2,0,reg2);addr(dat1,5,reg1); }
- break; }
- switch(adr2)
- { case 0x4: dummy="btst"; break;
- case 0x7: dummy="bset"; break;
- case 0x6: dummy="bclr"; break;
- case 0x5: dummy="bchg"; break;
- default: dummy=""; }
- if (dummy[0])
- { addr(dat1,0,reg2); cmdlen=1;
- addr(dat2,adr1,reg1); break; }
- if ((cmdw&0x0F00)!=0x800) break;
- switch(adr2)
- { case 0x0: dummy="btst"; break;
- case 0x1: dummy="bchg"; break;
- case 0x2: dummy="bclr"; break;
- case 0x3: dummy="bset"; }
- cmdlen=1; addr(dat1,0x7,0x4);
- addr(dat2,adr1,reg1); break;
- case 0x4:
- if (adr2==0x7)
- { dummy="lea"; cmdlen=4; addr(dat2,0x1,reg2);
- addr(dat1,adr1,reg1); break; }
- if (adr2==0x6)
- { dummy="chk"; cmdlen=2; addr(dat2,0x0,reg2);
- addr(dat1,adr1,reg1); break; }
- if ((adr2<3) && (reg2<4))
- { switch(reg2)
- { case 0x0: strcpy(dummy,"negx"); break;
- case 0x1: strcpy(dummy,"clr"); break;
- case 0x2: strcpy(dummy,"neg"); break;
- case 0x3: strcpy(dummy,"not"); }
- strcat(dummy,getlen(adr2));
- addr(dat1,adr1,reg1); break; }
- if ((cmdw&0x0100) || ((reg2==1) && (adr2==3)))
- break;
- if ((reg2<4) && (adr2==3))
- { cmdlen=2; dummy="move";
- switch(reg2)
- { case 0x0: strcpy(dat1,"sr");
- addr(dat2,adr1,reg1); break;
- case 0x2: cmdlen=1; strcpy(dat2,"ccr");
- addr(dat1,adr1,reg1); break;
- case 0x3: strcpy(dat2,"sr");
- addr(dat1,adr1,reg1);
- }
- break; }
- if ((cmdw&0x0FF8)==0x840)
- { dummy="swap"; addr(dat1,0,reg1); break; }
- if ((cmdw&0x0FA8)==0x880)
- { strcpy(dummy,"ext");
- strcat(dummy,getlen(((adr2&0x1)==0)? 1: 2));
- addr(dat1,0,reg1); break; }
- if (cmdw==0x4e71) { dummy="nop"; break; }
- if (cmdw==0x4e75) { dummy="rts"; break; }
- if (cmdw==0x4e73) { dummy="rte"; break; }
- if (cmdw==0x4e77) { dummy="rtr"; break; }
- if (cmdw==0x4e76) { dummy="trapv";break; }
- if (cmdw==0x4e70) { dummy="reset";break; }
- if (cmdw==0x4afc) { dummy="illegal";break; }
- if (cmdw==0x4e72)
- { dummy="stop"; cmdlen=2; addr(dat1,0x7,0x4); break; }
- if ((cmdw&0x0FF0)==0x0E40)
- { dummy="trap";
- sprintf(dat1,"#$%01X",cmdw&0x0F);break; }
- if ((cmdw&0x0F80)==0x0800)
- { if (adr2) dummy="pea"; else dummy="nbcd";
- addr(dat1,adr1,reg1); break; }
- if ((cmdw&0x0FC0)==0x0AC0)
- { dummy="tas"; addr(dat1,adr1,reg1); break; }
- if ((cmdw&0x0F00)==0xA00)
- { strcpy(dummy,"tst");
- strcat(dummy,getlen(adr2));
- addr(dat1,adr1,reg1); break; }
- if ((cmdw&0x0F80)==0x0E80)
- { if (cmdw&0x40) dummy="jmp"; else dummy="jsr";
- addr(dat1,adr1,reg1); break; }
- if ((cmdw&0x0FF0)==0x0E50)
- { if (cmdw&0x8)
- { dummy="unlk"; addr(dat1,0x1,reg1); break; }
- dummy="link"; addr(dat2,0x1,reg1);
- h2=getword();
- sprintf(dat1,"#$%04lX",h2); break; }
- if ((cmdw&0x0FF0)==0x0E60)
- { dummy="move";
- if (cmdw&0x8)
- { strcpy(dat1,"usp"); addr(dat2,0x1,reg1);
- break; }
- strcpy(dat2,"usp"); addr(dat1,0x1,reg1);
- break; }
- if ((cmdw&0x0B80)==0x0880)
- { strcpy(dummy,"movem");
- strcat(dummy,getlen((cmdw&0x40)? 2: 1));
- if (cmdw&0x0400)
- { movemreg(dat2,0); addr(dat1,adr1,reg1);
- break; }
- movemreg(dat1,(adr1==0x4)? 1: 0);
- addr(dat2,adr1,reg1); break; }
- break;
- case 0x5:
- if ((adr2&0x3)<3)
- { if (adr2&0x4) strcpy(dummy,"subq");
- else strcpy(dummy,"addq");
- strcat(dummy,getlen(adr2&0x3));
- addr(dat2,adr1,reg1);
- sprintf(dat1,"#$%02X",qnum(reg2)); break; }
- if ((cmdw&0x00F8)==0x00C8)
- { strcpy(dummy,"db"); strcat(dummy,branch(cmdw,1));
- addr(dat1,0,reg1);
- h2=getword();
- h1=PCcount-2+((h2>0x7FFF)? -(0x10000-h2): h2);
- sprintf(dat2,"$%06lX (rel)",h1); break; }
- if ((cmdw&0x00C0)==0x00C0)
- { strcpy(dummy,"s"); strcat(dummy,branch(cmdw,0));
- addr(dat1,adr1,reg1); break; }
- break;
- case 0x7:
- if ((cmdw&0x100)==0)
- { dummy="moveq"; addr(dat2,0,reg2);
- sprintf(dat1,"#$%02X",cmdw&0xFF); break; }
- break;
- case 0x8:
- if ((adr2&0x3)==3)
- { strcpy(dummy,"divu"); cmdlen=2;
- if (adr2&0x4) dummy[3]='s';
- addr(dat2,0,reg2); addr(dat1,adr1,reg1);
- break; }
- if ((cmdw&0x01F0)==0x0100)
- { dummy="sbcd"; addr(dat1,4*adr1,reg1);
- addr(dat2,4*adr1,reg2); break; }
- strcpy(dummy,"or");
- strcat(dummy,getlen(adr2&0x3));
- if (adr2&0x4)
- { addr(dat2,adr1,reg1); addr(dat1,0,reg2); }
- else
- { addr(dat1,adr1,reg1); addr(dat2,0,reg2); }
- break;
- case 0x9:
- if ((adr2&0x3)==3)
- { strcpy(dummy,"sub.w"); cmdlen=2;
- if (adr2&0x4) { dummy[4]='l'; cmdlen=4; }
- addr(dat1,adr1,reg1); addr(dat2,1,reg2);
- break; }
- if ((cmdw&0x0130)==0x100)
- { strcpy(dummy,"subx");
- strcat(dummy,getlen(adr2&0x3));
- addr(dat1,4*adr1,reg1);
- addr(dat2,4*adr1,reg2); break; }
- strcpy(dummy,"sub");
- strcat(dummy,getlen(adr2&0x3));
- if (adr2&0x4)
- { addr(dat2,adr1,reg1); addr(dat1,0,reg2); }
- else
- { addr(dat1,adr1,reg1); addr(dat2,0,reg2); }
- break;
- case 0xB:
- if ((adr2&0x3)==0x3)
- { strcpy(dummy,"cmp.w"); cmdlen=2;
- if (adr2&0x4) { dummy[4]='l'; cmdlen=4; }
- addr(dat1,adr1,reg1); addr(dat2,1,reg2);
- break; }
- if ((adr2&0x4)==0)
- { strcpy(dummy,"cmp"); strcat(dummy,getlen(adr2));
- addr(dat1,adr1,reg1); addr(dat2,0,reg2);
- break; }
- if (adr1==1)
- { strcpy(dummy,"cmpm");
- strcat(dummy,getlen(adr2&0x3));
- addr(dat1,3,reg1); addr(dat2,3,reg2);
- break; }
- strcpy(dummy,"eor");
- strcat(dummy,getlen(adr2&0x3));
- addr(dat1,0,reg2); addr(dat2,adr1,reg1);
- break;
- case 0xC:
- if (((adr2&0x3)==0x3) && (adr1!=1))
- { strcpy(dummy,"mulu"); cmdlen=2;
- if (adr2&0x4) dummy[3]='s';
- addr(dat1,adr1,reg1); addr(dat2,0,reg2);
- break; }
- if ((cmdw&0x01F0)==0x100)
- { dummy="abcd";
- addr(dat1,4*adr1,reg1);
- addr(dat2,4*adr1,reg2); break; }
- if (((cmdw&0x01F0)==0x140) || ((cmdw&0x1F8)==0x188))
- { dummy="exg";
- if (adr1==0)
- { addr(dat2,0,reg1); addr(dat1,0,reg2);
- break; }
- addr(dat1,2,reg1);
- if (adr2&0x1) addr(dat1,1,reg2);
- else addr(dat1,0,reg2);
- break; }
- strcpy(dummy,"and"); strcat(dummy,getlen(adr2&0x3));
- if (adr2&0x4)
- { addr(dat1,0,reg2); addr(dat2,adr1,reg1); }
- else
- { addr(dat2,0,reg2); addr(dat1,adr1,reg1); }
- break;
- case 0xD:
- if ((adr2&0x3)==0x3)
- { strcpy(dummy,"add.w"); cmdlen=2;
- if (adr2&0x4) { dummy[4]='l'; cmdlen=4; }
- addr(dat1,adr1,reg1); addr(dat2,1,reg2);
- break; }
- if ((adr2&0x4) && (adr1<2))
- { strcpy(dummy,"addx");
- strcat(dummy,getlen(adr2&0x3));
- addr(dat1,4*adr1,reg1);
- addr(dat2,4*adr1,reg2); break; }
- strcpy(dummy,"add"); strcat(dummy,getlen(adr2&0x3));
- if (adr2&0x4)
- { addr(dat1,0,reg2); addr(dat2,adr1,reg1); }
- else
- { addr(dat2,0,reg2); addr(dat1,adr1,reg1); }
- break;
- case 0xE:
- if ((adr2&0x3)<3)
- { switch(adr1&0x3)
- { case 0x0: strcpy(dummy,"as"); break;
- case 0x1: strcpy(dummy,"ls"); break;
- case 0x2: strcpy(dummy,"rox");break;
- case 0x3: strcpy(dummy,"ro"); }
- if (adr2&0x4) strcat(dummy,"l");
- else strcat(dummy,"r");
- strcat(dummy,getlen(adr2&0x3));
- if (adr1&0x4) addr(dat1,0,reg2);
- else sprintf(dat1,"#$%02X",qnum(reg2));
- addr(dat2,0,reg1); break; }
- h2=0;
- switch((cmdw&0x0E00)>>9)
- { case 0x0: strcpy(dummy,"as"); break;
- case 0x1: strcpy(dummy,"ls"); break;
- case 0x2: strcpy(dummy,"rox");break;
- case 0x3: strcpy(dummy,"ro"); break;
- default: h2=1; }
- if (h2) break;
- if (adr2&0x4) strcat(dummy,"l");
- else strcat(dummy,"r"); cmdlen=1;
- addr(dat1,adr1,reg1); break; }
- putstr(" ");
- if (dummy[0]==0) putstr(nokn); else putstr(dummy);
- if (dat1[0])
- { putstr(" "); putstr(dat1);
- if (dat2[0])
- { putchar(','); putstr(dat2); }}
- return;
- }
- unsigned int getword()
- { PCcount+=2L;
- return (((*(curbyte++))<<8)+(*(curbyte++)));
- }
- char *branch(unsigned int cmd,int flag)
- { int t;
- t=(cmd&0x0F00)>>8;
- switch(t)
- { case 0:
- if (flag&0x1) return "ra"; else return "t";
- case 0x1:
- if (flag&0x2) return "sr"; else return "f";
- case 0x2: return "hi";
- case 0x3: return "ls";
- case 0x4: return "cc";
- case 0x5: return "cs";
- case 0x6: return "ne";
- case 0x7: return "eq";
- case 0x8: return "vc";
- case 0x9: return "vs";
- case 0xA: return "pl";
- case 0xB: return "mi";
- case 0xC: return "ge";
- case 0xD: return "lt";
- case 0xE: return "gt";
- case 0xF: return "le";
- }
- return "??";
- }
- void addr(char *buf,unsigned int mode,unsigned int reg)
- { switch(mode)
- { case 0x0: /* Dx */
- buf[0]='d'; buf[1]='0'+reg; buf[2]=0;
- return;
- case 0x1: /* Ax */
- buf[0]='a'; buf[1]='0'+reg; buf[2]=0;
- return;
- case 0x2: /* (Ax) */
- buf[1]='a'; buf[2]='0'+reg;
- buf[0]='('; buf[3]=')'; buf[4]=0;
- return;
- case 0x3: /* (Ax)+ */
- buf[0]='('; buf[1]='a'; buf[2]='0'+reg;
- buf[3]=')'; buf[4]='+'; buf[5]=0;
- return;
- case 0x4: /* -(Ax) */
- buf[0]='-'; buf[1]='('; buf[2]='a';
- buf[3]='0'+reg; buf[4]=')'; buf[5]=0;
- return;
- case 0x5: /* $xxxx(Ax) */
- h2=getword(); sprintf(buf,"$%04lX",h2);
- buf[5]='('; buf[6]='a'; buf[7]='0'+reg;
- buf[8]=')'; buf[9]=0;
- return;
- case 0x6: /* $xx(Ax,A/Dy.?) */
- h2=getword();
- sprintf(buf,"$%02lX",h2&0xFF);
- buf[3]='('; buf[4]='a'; buf[5]='0'+reg; buf[6]=',';
- buf[7]=((h2&0x8000)? 'a': 'd');
- buf[8]='0'+((h2&0x7000)>>12); buf[9]='.';
- buf[10]=((h2&0x0800)? 'l': 'w');
- buf[11]=')'; buf[12]=0;
- return;
- case 0x7: /* Der Rest */
- switch(reg)
- { case 0x0: /* $xxxx */
- h2=getword();
- sprintf(buf,"$%04lX",h2);
- return;
- case 0x1: /* $xxxxxxxx */
- h2=getword()&0xFF;
- sprintf(buf,"$%02lX",h2);
- h2=getword();
- sprintf(&buf[3],"%04lX",h2);
- return;
- case 0x2: /* $xxxx(PC) */
- h2=getword();
- h1=PCcount-2+((h2>0x7FFF)? -(0x10000-h2): h2);
- sprintf(buf,"$%06lX(pc)",h1&0xFFFFFF);
- return;
- case 0x3: /* $xx(PC,A/Dx.?) */
- h2=getword();
- sprintf(buf,"$%02lX(pc,",h2&0xFF);
- buf[7]=((h2&0x8000)? 'a': 'd');
- buf[8]='0'+((h2&0x7000)>>12); buf[9]='.';
- buf[10]=((h2&0x0800)? 'l': 'w');
- buf[11]=')'; buf[12]=0;
- return;
- case 0x4: /* #$xx... */
- switch(cmdlen)
- { case 1: /* Byte */
- h2=getword();
- sprintf(buf,"#$%02lX",h2&0xFF);
- return;
- case 2: /* Word */
- h2=getword();
- sprintf(buf,"#$%04lX",h2);
- return;
- case 4: /* Long */
- h2=getword();
- sprintf(buf,"#$%04lX",h2);
- h2=getword();
- sprintf(&buf[6],"%04lX",h2);
- return;
- }
- default: strcpy(buf,"???");
- return;
- }
- default: strcpy(buf,"???");
- }
- return;
- }
- char *getlen(int binleng)
- { switch(binleng)
- { case 0x0: cmdlen=1; return ".b";
- case 0x1: cmdlen=2; return ".w";
- case 0x2: cmdlen=4; return ".l";
- }
- cmdlen=0; return ".?";
- }
- void movemreg(char *dat,int flag)
- { char bufz[1];
- unsigned int i,j,k,l;
- h2=getword();
- if (flag)
- { h1=0; k=1;
- for (i=0; i<16;)
- h1=(h1 | ((h2&(1<<(i++)))? (1<<(16-i)):0 ));
- h2=h1; }
- k=(h2&0xFF); l=(h2&0xFF00);
- bufz[1]=0;
- if (k)
- { strcat(dat,"d");
- for (i=0; i<8; )
- { if (k&(1<<(i++)))
- { bufz[0]='0'+i-1; strcat(dat,bufz); }}
- if (l) strcat(dat,"/"); }
- if (l)
- { strcat(dat,"a");
- for (i=0; i<8; )
- { if (l&(0x100<<(i++)))
- { bufz[0]='0'+i-1; strcat(dat,bufz); }}}
- return;
- }
- unsigned int qnum(unsigned int z)
- { if (z==0) return (8);
- return (z);
- }
- /* o.k., das war's */